import axios from 'axios';

// 检查token是否过期
export function checkTokenExpired() {
  // 如果没有token，直接返回未过期（由路由守卫处理无token的情况）
  const token = localStorage.getItem('token');
  if (!token) {
    return Promise.resolve({ expired: false });
  }
  
  // 获取用户信息，提取username
  const userStr = localStorage.getItem('user');
  if (!userStr) {
    console.warn('找不到用户信息，无法验证token');
    return Promise.resolve({ expired: false });
  }
  
  let user;
  try {
    user = JSON.parse(userStr);
  } catch (e) {
    console.error('解析用户信息失败:', e);
    return Promise.resolve({ expired: false });
  }
  
  const username = user.user?.username || user.username;
  if (!username) {
    console.warn('用户信息中没有username字段');
    return Promise.resolve({ expired: false });
  }
  
  // 调用后端接口验证token
  return axios.get(`/api/user/profile?username=${encodeURIComponent(username)}&token=${encodeURIComponent(token)}`)
    .then(response => {
      console.log('Token验证成功:', response.data);
      
      // 检查响应中是否包含错误码401（token过期）
      if (response.data && (response.data.code === 401 || response.data.code === 'TOKEN_EXPIRED')) {
        console.log('Token已过期（从响应数据中检测到）');
        return { expired: true };
      }
      
      return { expired: false, data: response.data };
    })
    .catch(error => {
      console.error('检查token失败:', error);
      console.log('错误详情:', {
        status: error.response?.status,
        statusText: error.response?.statusText,
        data: error.response?.data,
        url: error.config?.url
      });
      
      // 如果返回TOKEN_EXPIRED或401，则认为token过期
      if (error.response && 
          (error.response.status === 401 || 
           (error.response.data && error.response.data.code === 'TOKEN_EXPIRED'))) {
        return { expired: true };
      }
      // 其他错误不认为是token过期
      return { expired: false };
    });
}

// 创建 axios 实例
const api = axios.create({
  baseURL: '/api', // 根据实际情况设置基础 URL
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  }
});

// 请求拦截器
api.interceptors.request.use(
  config => {
    // 从本地存储获取 token
    const token = localStorage.getItem('token');
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`;
    }
    return config;
  },
  error => {
    console.error('请求错误:', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
api.interceptors.response.use(
  response => {
    // 如果返回的状态码为 200，说明接口请求成功，可以正常拿到数据
    if (response.status === 200) {
      // 检查响应数据中是否有token过期的标识
      if (response.data && (response.data.code === 401 || response.data.code === 'TOKEN_EXPIRED')) {
        // token过期，清除用户信息并跳转到登录页
        localStorage.removeItem('token');
        localStorage.removeItem('user');
        alert('登录已过期，请重新登录');
        window.location.href = '/login';
        return Promise.reject(new Error('token过期'));
      }
      return response.data;
    }
    return response;
  },
  error => {
    if (error.response) {
      switch (error.response.status) {
        case 401:
          // 未授权或token过期，清除用户信息并跳转到登录页
          localStorage.removeItem('token');
          localStorage.removeItem('user');
          alert('登录已过期，请重新登录');
          window.location.href = '/login';
          break;
        case 403:
          // 权限不足
          console.error('权限不足');
          break;
        case 404:
          // 请求不存在
          console.error('请求的资源不存在');
          break;
        case 500:
          // 服务器错误
          console.error('服务器错误');
          break;
        default:
          console.error(`未知错误: ${error.response.status}`);
      }
    } else {
      // 请求超时或网络错误
      console.error('请求超时或网络错误');
    }
    return Promise.reject(error);
  }
);

export default api;
